# 版本: 1.0.0
# 作者: 陈振玺
# 功能: CLI命令行接口模块

import os
import sys
import signal
import time
import click
from pathlib import Path
import logging
from .server import HTTPServer
from .file_manager import FileManager


# 全局变量存储服务器实例
server_instance = None


def signal_handler(signum, frame):
    """
    信号处理器，用于优雅关闭服务器
    """
    global server_instance
    if server_instance:
        click.echo("\n正在关闭服务器...")
        server_instance.stop()
    sys.exit(0)


@click.group()
@click.version_option(version="1.0.0", prog_name="http-server")
def main():
    """
    HTTP服务器命令行工具
    
    版本: 1.0.0
    作者: 陈振玺
    
    一个简单的HTTP服务器，提供文件管理和Web服务功能。
    """
    pass


@main.command()
@click.option('--host', '-h', default='192.168.10.98', help='服务器IP地址')
@click.option('--port', '-p', default=2121, help='服务器端口')
@click.option('--dir', '-d', 'serve_dir', default=None, help='服务目录路径')
@click.option('--background', '-b', is_flag=True, help='后台运行')
def start(host, port, serve_dir, background):
    """
    启动HTTP服务器
    """
    global server_instance
    
    # 设置信号处理器
    signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)
    
    try:
        # 创建服务器实例
        server_instance = HTTPServer(host=host, port=port, serve_dir=serve_dir)
        
        click.echo(f"启动HTTP服务器...")
        click.echo(f"地址: http://{host}:{port}")
        click.echo(f"服务目录: {server_instance.serve_dir}")
        click.echo("按 Ctrl+C 停止服务器")
        
        # 启动服务器
        server_instance.start(background=background)
        
        if background:
            click.echo("服务器已在后台启动")
        
    except Exception as e:
        click.echo(f"启动服务器失败: {e}", err=True)
        sys.exit(1)


@main.command()
@click.argument('source_path', type=click.Path(exists=True))
@click.option('--subdir', '-s', help='自定义子目录名')
@click.option('--host', '-h', default='192.168.10.98', help='服务器IP地址')
@click.option('--port', '-p', default=2121, help='服务器端口')
@click.option('--base-dir', '-d', help='基础服务目录')
def copy(source_path, subdir, host, port, base_dir):
    """
    拷贝文件或目录到服务目录
    
    SOURCE_PATH: 要拷贝的文件或目录路径
    """
    try:
        # 创建文件管理器实例
        file_manager = FileManager(
            base_dir=base_dir,
            server_host=host,
            server_port=port
        )
        
        source_path = os.path.abspath(source_path)
        
        if os.path.isfile(source_path):
            # 拷贝文件
            url = file_manager.copy_file(source_path, custom_subdir=subdir)
            click.echo(f"文件已拷贝: {source_path}")
            click.echo(f"访问地址: {url}")
        elif os.path.isdir(source_path):
            # 拷贝目录
            url = file_manager.copy_directory(source_path, custom_subdir=subdir)
            click.echo(f"目录已拷贝: {source_path}")
            click.echo(f"访问地址: {url}")
        else:
            click.echo(f"无效的路径: {source_path}", err=True)
            sys.exit(1)
            
    except Exception as e:
        click.echo(f"拷贝失败: {e}", err=True)
        sys.exit(1)


@main.command()
@click.option('--content', '-c', help='HTML内容')
@click.option('--file', '-f', 'content_file', type=click.File('r', encoding='utf-8'), help='HTML内容文件')
@click.option('--filename', '-n', default='index.html', help='HTML文件名')
@click.option('--subdir', '-s', help='自定义子目录名')
@click.option('--host', '-h', default='192.168.10.98', help='服务器IP地址')
@click.option('--port', '-p', default=2121, help='服务器端口')
@click.option('--base-dir', '-d', help='基础服务目录')
def create_html(content, content_file, filename, subdir, host, port, base_dir):
    """
    创建HTML文件
    """
    if not content and not content_file:
        click.echo("请提供HTML内容（--content）或内容文件（--file）", err=True)
        sys.exit(1)
    
    try:
        # 获取HTML内容
        if content_file:
            html_content = content_file.read()
        else:
            html_content = content
        
        # 创建文件管理器实例
        file_manager = FileManager(
            base_dir=base_dir,
            server_host=host,
            server_port=port
        )
        
        # 创建HTML文件
        url = file_manager.create_html_file(
            content=html_content,
            filename=filename,
            custom_subdir=subdir
        )
        
        click.echo(f"HTML文件已创建: {filename}")
        click.echo(f"访问地址: {url}")
        
    except Exception as e:
        click.echo(f"创建HTML文件失败: {e}", err=True)
        sys.exit(1)


@main.command()
@click.option('--subdir', '-s', default='', help='子目录名')
@click.option('--host', '-h', default='192.168.10.98', help='服务器IP地址')
@click.option('--port', '-p', default=2121, help='服务器端口')
@click.option('--base-dir', '-d', help='基础服务目录')
def list_files(subdir, host, port, base_dir):
    """
    列出服务目录中的文件
    """
    try:
        # 创建文件管理器实例
        file_manager = FileManager(
            base_dir=base_dir,
            server_host=host,
            server_port=port
        )
        
        # 列出文件
        items = file_manager.list_files(subdir)
        
        if not items:
            click.echo("目录为空或不存在")
            return
        
        click.echo(f"目录内容 ({subdir or '根目录'}):")
        click.echo("-" * 50)
        
        for item in items:
            type_indicator = "[DIR]" if item['type'] == 'directory' else "[FILE]"
            click.echo(f"{type_indicator:6} {item['name']}")
            if item['url']:
                click.echo(f"       URL: {item['url']}")
        
    except Exception as e:
        click.echo(f"列出文件失败: {e}", err=True)
        sys.exit(1)


@main.command()
@click.argument('relative_path')
@click.option('--host', '-h', default='192.168.10.98', help='服务器IP地址')
@click.option('--port', '-p', default=2121, help='服务器端口')
@click.option('--base-dir', '-d', help='基础服务目录')
@click.confirmation_option(prompt='确定要删除吗?')
def delete(relative_path, host, port, base_dir):
    """
    删除服务目录中的文件或目录
    
    RELATIVE_PATH: 相对于服务目录的路径
    """
    try:
        # 创建文件管理器实例
        file_manager = FileManager(
            base_dir=base_dir,
            server_host=host,
            server_port=port
        )
        
        # 删除文件或目录
        success = file_manager.delete_file(relative_path)
        
        if success:
            click.echo(f"已删除: {relative_path}")
        else:
            click.echo(f"删除失败: {relative_path}", err=True)
            sys.exit(1)
        
    except Exception as e:
        click.echo(f"删除失败: {e}", err=True)
        sys.exit(1)


@main.command()
def info():
    """
    显示程序信息
    """
    click.echo("HTTP服务器")
    click.echo(f"版本: 1.0.0")
    click.echo(f"作者: 陈振玺")
    click.echo("")
    click.echo("功能特性:")
    click.echo("- 启动HTTP服务器（默认192.168.10.98:2121）")
    click.echo("- 文件拷贝和管理")
    click.echo("- 时间戳子目录支持")
    click.echo("- HTML文件创建")
    click.echo("- 命令行接口")


if __name__ == '__main__':
    main()